package com.lostAndFind.project.filter;

import java.util.BitSet;
import java.util.Random;

public class BloomFilter {
    private static final int DEFAULT_SIZE = 2 << 24;  // 布隆过滤器的位数组大小
    private static final int[] seeds = new int[]{3, 5, 7, 11, 13, 31, 37, 61};  // 八种不同的哈希函数算法
    private BitSet bitSet = new BitSet(DEFAULT_SIZE);
    private Random random = new Random();

    /**
     * 添加元素
     *
     * @param value 元素值
     */
    public void add(String value) {
        for (int seed : seeds) {
            int hash = getHash(value, seed);
            bitSet.set(hash, true);
        }
    }

    /**
     * 判断元素是否存在
     *
     * @param value 元素值
     * @return true - 存在，false - 不存在
     */
    public boolean contains(String value) {
        if (value == null) {
            return false;
        }
        for (int seed : seeds) {
            int hash = getHash(value, seed);
            if (!bitSet.get(hash)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取哈希值
     *
     * @param value 元素值
     * @param seed  哈希算法种子值
     * @return 哈希值
     */
    private int getHash(String value, int seed) {
        int hash = 0;
        for (int i = 0; i < value.length(); i++) {
            hash = hash * seed + value.charAt(i);
        }
        return (DEFAULT_SIZE - 1) & hash;
    }
}
